const fs = require('fs-extra');

import { logSuccess, logInfo, logWarn, PAGE_CONFIG } from '@shared';
import { isCli } from '@core/util';

const srcPath = isCli() ? 'src/' : '';

// 读取模板文件，暂时拼接字符串。
const VUE_TPL = `
<template>
  <view>
  </view>
</template>
<script>
export default {
  data() {
    return {};
  }
}
</script>
<style>
</style>`;

const VUE_TPL_MULTI = `<template>
<view></view>
</template>
<script src="#js"></script>
<style scoped lang="#lang" src="#css">
</style>
`;

function getMultiTplData(pageName) {
  return VUE_TPL_MULTI.replace('#js', `./${pageName}.js`)
    .replace('#css', `./${pageName}.css`)
    .replace(' lang="#lang"', ''); // 暂时替换为空
}

function validPathName(path) {
  return /^[a-z\d\-\/]+$/.test(path);
}

function createPage({ path, own, multi, subpackage }) {
  if (!validPathName(path)) {
    logWarn(`[${path}] 不符合命名规范`);
    return;
  }
  // 可以省略前面的 pages 目录
  let pagePath = path.match(/^\/?pages\//) ? path : 'pages/' + path;
  // 移除开头的 / 符号
  pagePath = pagePath.replace(/^\//, '');

  let pageFilePath = srcPath + pagePath;
  // 可能出现重复的斜杠
  pageFilePath = pageFilePath.replace(/\/{2}/g, '/');

  // 限定页面拥有独立的目录，需要检测所在目录是否已存在。
  if (own) {
    const pageDir = pageFilePath.replace(/\/[a-z\d\-]+$/, '/');
    if (pageDir !== 'pages/') {
      const isExists = fs.existsSync(pageDir);
      if (isExists) {
        logWarn(
          `目录[${pageDir}]已存在，为确保每个页面拥有独立的目录，将不会执行创建操作。`
        );
        return;
      }
    }
  }

  if (fs.existsSync(pageFilePath + '.vue')) {
    logWarn(`页面[${pageFilePath}.vue]已存在`);
    return;
  }

  let tplJson = {
    path: pagePath,
    style: {
      navigationBarTitleText: '',
    },
  };

  if (subpackage) {
    tplJson['#subpackage'] = {
      root: pagePath.match(/pages\/[a-z\d\-]+/)[0],
    };
  }

  tplJson[PAGE_CONFIG] = {
    name: '页面名称',
    author: '作者',
    description: '页面描述信息',
  };

  logInfo(`页面路径[${pageFilePath}]`);

  if (multi) {
    const viewData = getMultiTplData(pagePath.match(/\/([a-z\d\-]+)/)[1]);
    fs.outputFileSync(pageFilePath + '.vue', viewData, 'utf8');
    fs.outputFileSync(pageFilePath + '.js', '', 'utf8');
    fs.outputFileSync(pageFilePath + '.css', '', 'utf8');
  } else {
    fs.outputFileSync(pageFilePath + '.vue', VUE_TPL, 'utf8');
  }
  fs.outputJsonSync(pageFilePath + '.json', tplJson, {
    spaces: 2,
  });

  // if (ajy) {
  //   // helpers
  //   fs.outputFileSync(
  //     pageFilePath.replace('pages/', 'helpers/') + '.js',
  //     `// ${pagePath}`,
  //     'utf8'
  //   );
  //   // service
  //   fs.outputFileSync(
  //     pageFilePath.replace('pages/', 'service/') + '.js',
  //     `// ${pagePath}`,
  //     'utf8'
  //   );
  // }

  logSuccess(`Create page [${pagePath}] success`);
}

export function createComponent(options) {
  // 目录是固定的？分包目录呢
  let filePath = srcPath + 'components/' + options.path;
  filePath = filePath.replace(/\/{2}/g, '/');

  fs.outputFileSync(filePath + '/index.vue', VUE_TPL, 'utf8');
  fs.outputFileSync(filePath + '/README.md', '', 'utf8');

  logSuccess(`Create component [${filePath}] success`);
}

// TODO 内部使用阶段先实现功能
export function create(options) {
  if (options.mode === 'component') {
    createComponent(options);
  } else {
    createPage(options);
  }
}
